package com.ibatis4J.framework.dal.util;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ibatis4J.framework.dal.dao.DataBaseOperation;

/**
 * 工具类
 * 
 * @author liuwenya
 *
 */
public class DalUtils {
	/** 日志 */
	private static final Logger LOGGER = LoggerFactory.getLogger(DalUtils.class);
	
	/**
	 * 把参数转成对象数组
	 * 
	 * @param parameter  参数
	 * @return   对象数组
	 */
	public static Object[] convertToObjectArray(Object parameter){
		Object[] retObject=null;
		if(parameter instanceof Object[]){
			retObject=(Object[])parameter;
		}else{
			retObject=new Object[]{parameter};
		}
		return retObject;
	}
	
	/**
	 * 把对象转成Map集合
	 * 
	 * @param object  参数
	 * @return     Map集合
	 */
	public static  Map<String,Object> convertToMap(Object object){
		if(object instanceof Map){
			return (Map<String,Object>)object;
		}
		Map<String,Object> returnMap=new HashMap<String,Object>();
		/**将实体Bean转为Map*/
		try {
			returnMap=convertBeanToMap(object);
		} catch (Exception e) {
			LOGGER.warn(e.getMessage());
		}
		return returnMap;
	}
	
	/**
	 * 将实体Bean转换成Map集合
	 * @param object  bean对象
	 * @return  Map集合
	 * @throws Exception  异常
	 */
	public static  Map<String,Object> convertBeanToMap(Object object) throws Exception{
		Map<String,Object> map=new HashMap<String,Object>();
		PropertyUtilsBean propertyUtilsBean=BeanUtilsBean.getInstance().getPropertyUtils();
		/**通过传入的对象类参数值，读取其属性数组 */
		PropertyDescriptor[] descriptors= propertyUtilsBean.getPropertyDescriptors(object);
		/**遍历属性数组，生成map*/
		 for (int i = 0; i < descriptors.length; i++) {
			PropertyDescriptor propertyDescriptor = descriptors[i];
			String name=propertyDescriptor.getName();
			if("class".equals(name)){
				continue;
			}
			/**获取属性的Method对象*/
			Method method=propertyUtilsBean.getReadMethod(propertyDescriptor);
			/**若其不为空则执行invoke调用*/
			if(method!=null){
				Object value=method.invoke(object);
				if(value!=null){
					map.put(name, value);
				}
			}
		}
		return map;
	}
	
	/**
	 * Map集合为null则新建
	 * @param map  map集合
	 * @return     非null的map集合
	 */
	public static Map<String,Object> mapIfNull(Map<String,Object> map){
		if(map==null){
			return new HashMap<String,Object>();
		}
		return map;
	}
	
	/**
	 * 设置对象属性
	 * 
	 * @param targetObject  目标对象
	 * @param propertyName  对象属性名
	 * @param propertyValue 对象属性值
	 */
	public static void setProperty(Object targetObject ,String propertyName,String propertyValue){
		try {
			Field field=targetObject.getClass().getDeclaredField(propertyName);
			field.setAccessible(true);
			field.set(propertyName, propertyValue);
		} catch (NoSuchFieldException e) {
			LOGGER.warn(e.getMessage(), e);
		} catch (SecurityException e) {
			LOGGER.warn(e.getMessage(), e);
		} catch (IllegalArgumentException e) {
			LOGGER.warn(e.getMessage(), e);
		} catch (IllegalAccessException e) {
			LOGGER.warn(e.getMessage(), e);
		}
	}
	
	
}

